package com.lollipop.synthential.list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @Author: J.K
 * @Date: 2020-05-21 15:28
 * @Description: 删除"3"这个元素 以下结果对LinkedList同样
 */
public class ListPractise {
    public static void main(String[] args) {
        delRepeat_1();
//        delRepeat_2();
        delRepeat_3();
    }

    /**
     * 1.使用for (int i = 0; i < list.size(); i++)方式
     * 会报错-因为增强 for 循环过程其实调用的就是迭代器的 next () 方法，
     * 当你调用 list.remove () 方法进行删除时，modCount 的值会 +1，
     * 而这时候迭代器中的 expectedModCount 的值却没有变，导致在迭代器下次执行 next () 方法时，
     * expectedModCount != modCount 就会报 ConcurrentModificationException 的错误。
     */
    private static void delRepeat_1() {
        List<String> list = getStrings();
        for (int i = 0; i < list.size(); i++) {
            if ("3".equals(list.get(i))) {
                list.remove(i);
            }
        }
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
    }

    /**
     * 2.使用增强for循环进行删除
     * 结果也不能删除这个元素
     */
    private static void delRepeat_2() {
        List<String> list = getStrings();
        for (String s : list) {
            if ("3".equals(s)) {
                list.remove(s);
            }
        }
    }

    /**
     * 3.使用迭代器的方式能够删除"3"这个元素
     */
    private static void delRepeat_3() {
        List<String> list = getStrings();
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            if ("3".equals(it.next())) {
                it.remove();
            }
        }
        for (String s : list) {
            System.out.print(s + " ");
        }
    }

    private static List<String> getStrings() {
        return new ArrayList<String>() {{
            add("1");
            add("2");
            add("3");
            add("3");
            add("3");
            add("4");
            add("5");
            add("6");
        }};
    }
}